package com.atguigu.idea;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Author: shenhao
 * @CreatTime: 2024/10/9 20:28
 * @Version: 1.0
 */
public class DebugDemo {
    public static void main(String[] args) {
        //1 第一组基础界面
        // 光标回到当前断点行+ 步过+步入+强制步入+步出+运行到光标位置
        //helloDebug();

        //2 Trace Current Stream Chain
        //myStreamChain();

        //3 forceReturn，少用stop，减少一次废数据
        //forceReturnAndStop();

        //4 四大断点Line Breakpoint+Field Watchpoint+Method Breakpoint+Exception Breakpoint
        //4.1 Line Breakpoint，大家都懂，略...... 行断点

        //4.2 Field Watchpoint ，变量监视断点在变量Field上面打断点，默认眼睛图标 在我自己的版本中 -⚪图标
        //setFieldWatchpoint();

        //4.3 Method Breakpoint，接口方法断点在接口内定义的方法上面打断点，默认菱形图标 在我的版本中默认方形图标□
        /*Phone phone = new Phone();
        phone.insert();
        Computer computer = new Computer();
        computer.insert();*/



        //4.4 Exception BreakPoint 异常定位断点
        //4.4.1 新增异常断点,点击View Breakpoints...
        //4.4.2 选择异常类型
        //4.4.3 选择hit和log
        //4.4.4 运行含有null异常的代码，自动闪电定位，不用人工打断点
        Integer i =null;
        System.out.println(i.intValue());
    }
    //Field BreakPoint,在变量Field上面打断点，field watchpoint默认眼睛图标 在我自己的版本中 -⚪图标
    private static int x;
    private static void setFieldWatchpoint() {
        x = 55;
        setFieldWatchpoint2();//access
    }

    private static void setFieldWatchpoint2() {
        x = 77;
    }

    private static void forceReturnAndStop() {
        System.out.println("---mysql-01");
        baseEmbed();
        System.out.println("---redis-02");
        System.out.println("---RabbitMQ-03");
        System.out.println("---hashCode:"+new Object().hashCode());
    }

    private static void myStreamChain() {
        List<Integer> list = Stream.of(1, 2, 3, 4, 5, 6).filter(i -> i > 3).map(i -> i * 2).collect(Collectors.toList());
        //List<Integer> list = Stream.of(1, 2, 3, 4, 5, 6).filter(i -> i > 3).map(i -> i * 2).toList();
    }

    private static void helloDebug() {
        Map<Integer,String> map = new HashMap<Integer,String>();
        map.put(1, "one");
        map.put(2, "two");//步入, 进入方法内部,但jdk自带的方法进不去,需要强制步入才能进入
        baseEmbed();
        map.put(3, "three");
        map.put(4, "four");

        map.forEach((k,v)->{
            System.out.println(k+"\t"+v);
        });
    }

    private static void baseEmbed() {
        System.out.println("baseEmbed()----1111");
        System.out.println("baseEmbed()----2222");
        System.out.println("baseEmbed()----3333");
        System.out.println("baseEmbed()----4444");
    }
    //resetFrame 重置方法入栈 相当于悔棋, 将入栈的方法退出栈 方法就是栈帧, frame
    // 方法的进进出出
    // 强制return, 减少废数据的产生, forceReturn, 强制return退出 对下游系统的隔离
}

interface USB{
    //接口方法断点 method breakpoint 可以看到那些类实现过这个方法,一目了然
    public void insert();
}

class Phone implements USB{
    public void insert() {
        System.out.println("--------------Phone insert");
    }
}

class Computer implements USB{
    public void insert() {
        System.out.println("--------------Computer insert");
    }
}